#!/usr/bin/env bash

xdg=0
prefix='~/.fzf'
prefix_expand=~/.fzf
fish_dir=${XDG_CONFIG_HOME:-$HOME/.config}/fish

help() {
  cat << EOF
usage: $0 [OPTIONS]

    --help               Show this message
    --xdg                Remove files generated under \$XDG_CONFIG_HOME/fzf
EOF
}

for opt in "$@"; do
  case $opt in
    --help)
      help
      exit 0
      ;;
    --xdg)
      xdg=1
      prefix='"${XDG_CONFIG_HOME:-$HOME/.config}"/fzf/fzf'
      prefix_expand=${XDG_CONFIG_HOME:-$HOME/.config}/fzf/fzf
      ;;
    *)
      echo "unknown option: $opt"
      help
      exit 1
      ;;
  esac
done

ask() {
  while true; do
    read -p "$1 ([y]/n) " -r
    REPLY=${REPLY:-"y"}
    if [[ $REPLY =~ ^[Yy]$ ]]; then
      return 0
    elif [[ $REPLY =~ ^[Nn]$ ]]; then
      return 1
    fi
  done
}

remove() {
  echo "Remove $1"
  rm -f "$1"
}

remove_line() {
  src=$1
  echo "Remove from $1:"

  shift
  line_no=1
  match=0
  while [ -n "$1" ]; do
    line=$(sed -n "$line_no,\$p" "$src" | \grep -m1 -nF "$1")
    if [ $? -ne 0 ]; then
      shift
      line_no=1
      continue
    fi
    line_no=$(($(sed 's/:.*//' <<< "$line") + line_no - 1))
    content=$(sed 's/^[0-9]*://' <<< "$line")
    match=1
    echo "  - Line #$line_no: $content"
    [ "$content" = "$1" ] || ask "    - Remove?"
    if [ $? -eq 0 ]; then
      temp=$(mktemp)
      awk -v n=$line_no 'NR == n {next} {print}' "$src" > "$temp" &&
        cat "$temp" > "$src" && rm -f "$temp" || break
      echo "      - Removed"
    else
      echo "      - Skipped"
      line_no=$((line_no + 1))
    fi
  done
  [ $match -eq 0 ] && echo "  - Nothing found"
  echo
}

for shell in bash zsh; do
  shell_config=${prefix_expand}.${shell}
  remove "${shell_config}"
  remove_line ~/.${shell}rc \
    "[ -f ${prefix}.${shell} ] && source ${prefix}.${shell}" \
    "source ${prefix}.${shell}"
done

bind_file="${fish_dir}/functions/fish_user_key_bindings.fish"
if [ -f "$bind_file" ]; then
  remove_line "$bind_file" "fzf_key_bindings"
  remove_line "$bind_file" "fzf --fish | source"
fi

if [ -d "${fish_dir}/functions" ]; then
  remove "${fish_dir}/functions/fzf.fish"
  remove "${fish_dir}/functions/fzf_key_bindings.fish"

  if [ -z "$(ls -A "${fish_dir}/functions")" ]; then
    rmdir "${fish_dir}/functions"
  else
    echo "Can't delete non-empty directory: \"${fish_dir}/functions\""
  fi
fi

config_dir=$(dirname "$prefix_expand")
if [[ $xdg == 1 ]] && [[ $config_dir == */fzf ]] && [[ -d $config_dir ]]; then
  rmdir "$config_dir"
fi
